import pika
from PyQt5.QtCore import pyqtSignal, QThread

# 定义RabbitMQ消息队列处理线程（继承自QThread）
class RabbitMqThread(QThread):
    # 定义信号，用于发射接收到的消息
    rabbit_signal = pyqtSignal(bytes)

    def __init__(self):
        super().__init__()
        # RabbitMQ连接配置
        self.root = "admin"  # 用户名
        self.password = "Q1w2e3r4t5!"  # 密码
        self.ip = "114.215.190.210"  # 服务器IP地址
        self.queue_name = 'fly.pressure.queue'  # 队列名称
        self.routing_key = 'fly.pressure.#'  # 路由键（支持通配符）
        self.exchange = 'topic_exchange'  # 交换机名称
        self.exchange_type = 'topic'  # 交换机类型（主题模式）

    def callback(self, ch, method, properties, message):
        """RabbitMQ消息回调函数"""
        # 当接收到消息时，通过信号发射消息内容
        self.rabbit_signal.emit(message)

    def subscribe_to_queue(self):
        """订阅RabbitMQ队列"""
        # 创建认证凭据
        user_info = pika.PlainCredentials(self.root, self.password)
        # 建立连接
        connection = pika.BlockingConnection(
            pika.ConnectionParameters(self.ip, 5672, '/', user_info))
        channel = connection.channel()

        # 声明一个主题交换机（如果不存在则创建）
        channel.exchange_declare(
            exchange=self.exchange,
            exchange_type=self.exchange_type
        )

        # 声明队列（如果不存在则创建）
        # durable=True 表示队列持久化（服务器重启后仍存在）
        # passive=True 表示如果队列不存在不会创建新队列，但会检查队列是否存在
        channel.queue_declare(
            queue=self.queue_name,
            durable=True,
            passive=True
        )

        # 将队列绑定到交换机，使用通配符路由键
        # 'fly.pressure.#' 表示匹配所有以 'fly.pressure.' 开头的路由键
        channel.queue_bind(
            exchange=self.exchange,
            queue=self.queue_name,
            routing_key=self.routing_key
        )

        # 设置消息消费回调函数
        # auto_ack=True 表示自动确认消息（收到即确认）
        channel.basic_consume(
            queue=self.queue_name,
            on_message_callback=self.callback,
            auto_ack=True
        )

        # 开始消费消息（阻塞式）
        channel.start_consuming()

    def run(self):
        """线程入口函数"""
        self.subscribe_to_queue()


# 主程序入口
if __name__ == '__main__':
    # 创建RabbitMQ线程实例
    rabbitmq = RabbitMqThread()
    # 启动线程
    rabbitmq.start()